package com.bkhech.satoken.satoken;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器鉴权
 * 注册 sa-token 全局拦截器
 *
 * 为了不为项目带来不必要的性能负担，拦截器默认处于关闭状态
 * 因此，为了使用注解鉴权，你必须手动将 Sa-Token 的全局拦截器注册到你项目中
 *
 * 缺点：
 * 默认的拦截器模式却有一个缺点，那就是无法在Controller层以外的代码使用进行校验
 * 因此Sa-Token提供AOP插件，你只需在pom.xml里添加如下依赖，便可以在任意层级使用注解鉴权
 *
 * <-- Sa-Token 整合 SpringAOP 实现注解鉴权 -->
 * <dependency>
 *     <groupId>cn.dev33</groupId>
 *     <artifactId>sa-token-spring-aop</artifactId>
 *     <version>1.34.0</version>
 * </dependency>
 *
 * @author guowm
 * @date 2023/8/9
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

    /**
     *  注册 Sa-Token 拦截器打开注解鉴权功能
     *
     * 注意点：
     *  1.路由匹配符不用写前缀：server.servlet.context-path
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handle -> {
//                    StpUtil.checkLogin();
                    // 指定一条 match 规则
                    SaRouter.match("/**")  // 拦截的 path 列表，可以写多个
                            //注意点：不用写前缀：server.servlet.context-path
                            .notMatch("/user/doLogin", "/mutex/login") // 排除掉的 path 列表，可以写多个
                            .check(StpUtil::checkLogin); // 要执行的校验动作
                    // 根据路由划分模块，不同模块不同鉴权
//                    SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
//                    SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
                }))
                .addPathPatterns("/**")
                ;
    }
}
